﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;

namespace TanWeb.Models.DataAccess.DbHelper
{
    public class DbHelper
    {
        /// Khai báo biến
        #region Variables
        SqlConnection cnn;
        #endregion

        // Khởi tạo đối tượng clsDatabase
        #region Init Class
        public DbHelper()
        {
            cnn = new SqlConnection();
        }
        #endregion


        /// <summary>
        /// Kết nối đến cơ sở dữ liệu
        /// </summary>
        #region Connect to database
        public void Connect()
        {
            // Kiểm tra trạng thái của cnn
            if (cnn == null || cnn.State == ConnectionState.Open)
            {
                return;
            }

            try
            {
                // Khai báo chuỗi kết nối
                string _strConnect = System.Configuration.ConfigurationManager.ConnectionStrings["connectionStringName"].ConnectionString; ;

                // Gán chuỗi kết nối cho cnn
                cnn.ConnectionString = _strConnect;
                cnn.Open();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion


        /// <summary>
        /// Hủy kết nối đến cơ sở dữ liệu
        /// </summary>
        #region Disconnect to database
        public void Disconnect()
        {
            try
            {
                if (cnn == null || cnn.State == ConnectionState.Closed)
                {
                    return;
                }
                cnn.Close();
                cnn.Dispose();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        /// <summary>
        /// Kiểm tra 1 trường nào đó đã tồn tại trong TableName. Phương thức trả về true nếu đã tồn tại và false nếu ngược lại
        /// </summary>
        /// <param name="Field"> Field </param>
        /// <param name="TableName"> Tên bảng </param>
        /// <param name="Value"> Giá trị điều kiện cho value </param>
        #region Is Existed
        public bool IsExisted(string Field, string TableName, string Value)
        {
            // Khai báo chuỗi thực thi
            string _strSQL = "select Count(" + Field + ") from dbo_" + TableName + " where " + Field + " = " + Value;
            // Tạo đối tượng cmd
            SqlCommand cmd = new SqlCommand(_strSQL, cnn);
            // Tạo biến kiểm tra bl
            bool bl = true;

            // Bẫy lỗi thực thi câu lệnh SQL
            try
            {
                if ((int)cmd.ExecuteScalar() == 0)
                {
                    bl = false;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                // Hủy đối tượng command
                cmd.Dispose();
            }

            // Trả về giá trị của bl
            return bl;
        }

        /// <summary>
        /// Kiểm tra 1 tập các trường nào đó đã tồn tại trong TableName. Phương thức trả về true nếu đã tồn tại và false nếu ngược lại
        /// </summary>
        /// <param name="Field"> Field </param>
        /// <param name="TableName"> Tên bảng </param>
        /// <param name="Value"> Giá trị điều kiện cho value </param>
        public bool IsExisted(string Conditions, string TableName)
        {
            // Khai báo chuỗi thực thi
            string _strSQL = "select Count(*) from dbo_" + TableName + " where " + Conditions;
            // Tạo đối tượng cmd
            SqlCommand cmd = new SqlCommand(_strSQL, cnn);
            // Tạo biến kiểm tra bl
            bool bl = true;
            // Bẫy lỗi thực thi câu lệnh SQL
            try
            {
                if ((int)cmd.ExecuteScalar() == 0)
                    bl = false;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                // Hủy đối tượng command
                cmd.Dispose();
            }

            // Trả về giá trị của bl
            return bl;
        }
        #endregion

        /// <summary>
        /// Thực thi câu lệnh SQL và trả về 1 DataSet ứng với câu lệnh SQL đó
        /// </summary>
        /// <param name="TableName"> Tên Bảng </param>
        /// <returns> DataSet </returns>
        #region Get DataSet
        public DataSet GetDataSet(string TableName)
        {
            // Tạo đối tượng ds
            DataSet ds = new DataSet();
            // Khai báo chuỗi thực thi SQL
            string _strSQL = "select * from dbo_" + TableName;
            // Tạo đối tượng da
            SqlDataAdapter da = new SqlDataAdapter(_strSQL, cnn);
            try
            {
                // Truyền dữ liệu vào ds
                da.Fill(ds);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                // Hủy bỏ đối tượng adapter
                da.Dispose();
            }

            // Trả về ds
            return ds;
        }
        #endregion



        /// <summary>
        /// Thực thi câu lệnh SQL và trả về 1 DataSet ứng với câu lệnh SQL đó
        /// </summary>
        /// <param name="FieldList"> Danh sách các field cần lọc </param>
        /// <param name="TableNameList"> Danh sách tên các bảng </param>
        /// <param name="Conditions"> Chuỗi danh sách các điều kiện lọc </param>
        /// <returns> DataSet </returns>
        #region Get DataSet
        public DataSet GetDataSet(string FieldList, string TableNameList, string Conditions)
        {
            // Tạo đối tượng ds
            DataSet ds = new DataSet();
            // Khai báo chuỗi thực thi SQL
            string _strSQL = "select " + FieldList + " from " + TableNameList + " " + Conditions;
            // Tạo đối tượng da
            SqlDataAdapter da = new SqlDataAdapter(_strSQL, cnn);

            try
            {
                // Truyền dữ liệu vào ds
                da.Fill(ds);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                // Hủy bỏ đối tượng adapter
                da.Dispose();
            }

            // Trả về ds
            return ds;
        }
        #endregion

        #region Insert
        public void Insert(string strTable, string strValues)
        {
            string strSQL = "insert into dbo_" + strTable + " values(" + strValues + ")";
            SqlCommand cmd = new SqlCommand(strSQL, cnn);
            try
            {
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Dispose();
            }
        }

        #endregion


        /// <summary>
        /// Update 1 trường được chỉ định nào đó trong database. Phương thức trả về true: Update thành công, hoặc false: nếu ngược lại
        /// </summary>
        /// <param name="TableName"> Tên bảng cần update </param>
        /// <param name="Values"> Set trường bằng các giá trị </param>
        /// <param name="Condition"> Chuỗi các điều kiện </param>
        #region Update
        public bool Update(string TableName, string Values, string Condition)
        {
            bool bl = false;

            // Khai báo chuỗi thực thi SQL
            string _strSQL = "update dbo_" + TableName + " set " + Values + " where " + Condition;
            // Tạo đối tượng cmd
            SqlCommand cmd  = new SqlCommand(_strSQL, cnn);
            // Bẫy lỗi lệnh update
            try
            {
                // Thực thi câu lệnh SQL
                cmd.ExecuteNonQuery();
                bl = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                // Hủy đối tượng command
                cmd.Dispose();
            }

            return bl;
        }
        #endregion


        /// <summary>
        /// Delete dữ liệu từ database. Phương thức trả về -1: nếu xóa thất bại, ngược lại là số trường đã được xóa
        /// </summary>
        /// <param name="TableName"> Tên bảng cần xóa </param>
        /// <param name="Field"> Tên Field điều kiện </param>
        /// <param name="Value"> Giá trị điều kiện </param>
        #region Delete
        public int Delete(string TableName, string Field, string Value)
        {
            string _strSQL = "delete from dbo_" + TableName + " where " + Field + " = " + Value;
            SqlCommand cmd = new SqlCommand(_strSQL, cnn);

            // Bẫy lỗi lệnh delete
            try
            {
                int EffectedRow = (int)cmd.ExecuteNonQuery();
                return EffectedRow;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                // Hủy đối tượng command
                cmd.Dispose();
            }
        }
        public int Delete(string TableName)
        {
            string _strSQL = "delete from dbo_" + TableName;
            SqlCommand cmd = new SqlCommand(_strSQL, cnn);

            // Bẫy lỗi lệnh delete
            try
            {
                int EffectedRow = (int)cmd.ExecuteNonQuery();
                return EffectedRow;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                // Hủy đối tượng command
                cmd.Dispose();
            }
        }
        #endregion


        /// <summary>
        /// Lọc dữ liệu cho báo cáo. Phương thức trả về 1 DataSet
        /// </summary>
        /// <param name="FieldList"> Danh sách các field cần báo cáo </param>
        /// <param name="TableNameList"> Danh sách các bảng tham gia </param>
        /// <param name="Conditions"> Danh sách các điều kiện cần lọc </param>
        /// <returns> Nguồn DataSet cho report </returns>
        #region Get Source For Report
        public DataSet GetSourceForReport(string FieldList, string TableNameList, string Conditions)
        {
            DataSet ds = new DataSet();
            string _strSQL = "select " + FieldList + " from " + TableNameList + " where " + Conditions;
            SqlDataAdapter da = new SqlDataAdapter(_strSQL, cnn);

            try
            {
                da.Fill(ds);
            }
            catch(Exception ex)
            {
                throw ex;
            }
            finally
            {
                da.Dispose();
            }

            return ds;
        }
    #endregion
    }
}